package cn.cscb.mms.server.service.impl;

import cn.cscb.mms.common.context.BaseContext;
import cn.cscb.mms.pojo.dto.ManagerTaskInfoDTO;
import cn.cscb.mms.pojo.vo.ManagerTaskInfoVO;
import cn.cscb.mms.server.mapper.StatisticMapper;
import cn.cscb.mms.server.service.StatisticService;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * 营销统计服务接口实现
 *
 * @author Gao Yipeng
 */
@Service("statisticService")
public class StatisticServiceImpl implements StatisticService {

    @Resource(name = "statisticMapper")
    private StatisticMapper statisticMapper;

    /**
     * 统计客户经理名下营销任务的各种状态
     *
     * @param dto 入参包括：客户经理工号、统计起始时间、统计结束时间
     * @return 统计结果
     */
    @Override
    public ManagerTaskInfoVO statisticTaskInfo(ManagerTaskInfoDTO dto) {
        // 从BaseContext中获取empNo
        dto.setClaimId(BaseContext.getCurrentEmpNo());
        // 参数校验
        Assert.notBlank(dto.getClaimId(), "客户经理工号不能为空");
        Assert.notNull(dto.getTaskStartDate(), "统计起始时间不能为空");
        Assert.notNull(dto.getTaskEndDate(), "统计结束时间不能为空");
        // 获取统计结果
        ManagerTaskInfoVO managerTaskInfoVO = statisticMapper.selectStatistic(dto);
        managerTaskInfoVO.setRanked(statisticMapper.selectRank(dto));
        return managerTaskInfoVO;
    }

    /**
     * 统计所有客户经理名下营销任务的各种状态
     *
     * @param dto 入参包括：排序字段、统计起始时间、统计结束时间、分页参数
     * @return 统计结果列表
     */
    @Override
    public IPage<ManagerTaskInfoVO> statisticTaskInfoList(ManagerTaskInfoDTO dto) {
        // 参数校验
        String ordered = dto.getOrdered();
        Assert.notBlank(ordered, "排序字段不能为空");
        Assert.notNull(dto.getTaskStartDate(), "统计起始时间不能为空");
        Assert.notNull(dto.getTaskEndDate(), "统计结束时间不能为空");
        // 获取统计结果
        Page<ManagerTaskInfoVO> pages = new Page<>(dto.getPage(), dto.getRows());
        IPage<ManagerTaskInfoVO> vo = null;
        // 根据排序字段调用（按照规范不使用 ${ordered}）
        if ("meets".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByMeets(dto, pages);
        } else if ("phones".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByPhones(dto, pages);
        } else if ("loans".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByLoans(dto, pages);
        } else if ("deposits".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByDeposits(dto, pages);
        } else if ("ownedTasks".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByOwnedTasks(dto, pages);
        } else if ("completedTasks".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByCompletedTasks(dto, pages);
        } else if ("points".equals(ordered)) {
            vo = statisticMapper.selectAllOrderByPoints(dto, pages);
        }
        return vo;
    }

    /**
     * 统计客户经理前6个月中每个月的营销数据
     *
     * @param dto 入参：客户经理工号
     * @return 统计列表
     */
    @Override
    public List<ManagerTaskInfoVO> statisticLastSixMonth(ManagerTaskInfoDTO dto) {
        LocalDate now = LocalDate.now();
        List<ManagerTaskInfoVO> voList = new ArrayList<>();
        // 前1个月的统计数据
        dto.setTaskStartDate(now.minusMonths(1));
        dto.setTaskEndDate(now);
        voList.add(statisticMapper.selectStatistic(dto));
        // 前2个月的统计数据
        dto.setTaskStartDate(now.minusMonths(2));
        dto.setTaskEndDate(now.minusMonths(1));
        voList.add(statisticMapper.selectStatistic(dto));
        // 前3个月的统计数据
        dto.setTaskStartDate(now.minusMonths(3));
        dto.setTaskEndDate(now.minusMonths(2));
        voList.add(statisticMapper.selectStatistic(dto));
        // 前4个月的统计数据
        dto.setTaskStartDate(now.minusMonths(4));
        dto.setTaskEndDate(now.minusMonths(3));
        voList.add(statisticMapper.selectStatistic(dto));
        // 前5个月的统计数据
        dto.setTaskStartDate(now.minusMonths(5));
        dto.setTaskEndDate(now.minusMonths(4));
        voList.add(statisticMapper.selectStatistic(dto));
        // 前6个月的统计数据
        dto.setTaskStartDate(now.minusMonths(6));
        dto.setTaskEndDate(now.minusMonths(5));
        voList.add(statisticMapper.selectStatistic(dto));

        return voList;
    }
}
